package com.dimenlink.web.controller;

import com.dimenlink.entity.dto.TokenUserInfoDto;
import com.dimenlink.entity.enums.VideoStatusEnum;
import com.dimenlink.entity.po.VideoInfoFilePost;
import com.dimenlink.entity.po.VideoInfoPost;
import com.dimenlink.entity.query.VideoInfoPostQuery;
import com.dimenlink.entity.vo.PaginationResultVO;
import com.dimenlink.entity.vo.ResponseVO;
import com.dimenlink.entity.vo.VideoStatusCountInfoVO;
import com.dimenlink.service.VideoInfoFilePostService;
import com.dimenlink.service.VideoInfoPostService;
import com.dimenlink.service.VideoInfoService;
import com.dimenlink.utils.JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

@RestController
@RequestMapping("/ucenter")
@Validated
@Slf4j
public class UcenterVideoPostController extends ABaseController{
    @Resource
    private VideoInfoPostService videoInfoPostService;
    @Resource
    private VideoInfoFilePostService videoInfoFilePostService;
    @Resource
    private VideoInfoService videoInfoService;

    /**
     * 发布/更新视频信息接口
     *
     * @param videoId 视频ID，为空表示新增视频
     * @param videoCover 视频封面图片URL
     * @param videoName 视频名称，不能为空，最多100字符
     * @param pCategoryId 一级分类ID，不能为空
     * @param categoryId 二级分类ID，可为空
     * @param postType 发布类型，不能为空
     * @param tags 视频标签，不能为空，最多300字符
     * @param introduction 视频简介，最多2000字符
     * @param interaction 互动设置，最多3个字符
     * @param uploadFileList 上传的视频文件列表，JSON格式字符串
     * @return ResponseVO 统一响应结果
     */
    @RequestMapping("/postVideo")
    public ResponseVO postVideo(String videoId,
                                @NotEmpty String videoCover,
                                @NotEmpty @Size(max = 100) String videoName,
                                @NotNull Integer pCategoryId,
                                Integer categoryId,
                                @NotNull Integer postType,
                                @NotEmpty @Size(max = 300) String tags,
                                @Size(max = 2000) String introduction,
                                @Size(max = 3) String interaction,
                                @NotEmpty String uploadFileList) {
        // 获取当前登录用户信息
        TokenUserInfoDto tokenUserInfoDto = getTokenUserInfoDto();

        // 将前端传递的 JSON 数据转换为 Java 对象
        List<VideoInfoFilePost> filePostList = JsonUtils.convertJsonArray2List(uploadFileList, VideoInfoFilePost.class);

        // 构建视频信息对象
        VideoInfoPost videoInfo = new VideoInfoPost();
        videoInfo.setVideoId(videoId);
        videoInfo.setVideoName(videoName);
        videoInfo.setVideoCover(videoCover);
        videoInfo.setpCategoryId(pCategoryId);
        videoInfo.setCategoryId(categoryId);
        videoInfo.setPostType(postType);
        videoInfo.setTags(tags);
        videoInfo.setIntroduction(introduction);
        videoInfo.setInteraction(interaction);

        videoInfo.setUserId(tokenUserInfoDto.getUserId());

        // 调用服务层保存视频信息
        videoInfoPostService.saveVideoInfo(videoInfo, filePostList);

        return getSuccessResponseVO(null);
    }

    @RequestMapping("/loadVideoList")
    public ResponseVO loadVideoPost(Integer status, Integer pageNo,String videoNameFuzzy) {
        // 获取当前登录用户信息
        TokenUserInfoDto tokenUserInfoDto = getTokenUserInfoDto();

        // 初始化视频信息查询对象，用于封装查询条件
        VideoInfoPostQuery videoInfoQuery = new VideoInfoPostQuery();
        // 设置查询的用户 ID，从 token 解析出的用户信息中获取
        videoInfoQuery.setUserId(tokenUserInfoDto.getUserId());
        // 设置排序规则，按视频创建时间倒序排列
        videoInfoQuery.setOrderBy("v.create_time desc");
        // 设置分页页码
        videoInfoQuery.setPageNo(pageNo);

        // 处理状态参数，status 不为空时进入条件逻辑
        if (status != null) {
            // 若状态为 -1（进行中），设置需要排除的状态数组（审核成功、审核失败）
            if (status == -1) {
                videoInfoQuery.setExcludeStatusArray(new Integer[]{
                        VideoStatusEnum.STATUS3.getStatus(),
                        VideoStatusEnum.STATUS4.getStatus()
                });
            } else {
                // 若状态为其他有效值，直接设置查询状态
                videoInfoQuery.setStatus(status);
            }
        }

        // 设置视频名称模糊查询条件
        videoInfoQuery.setVideoNameFuzzy(videoNameFuzzy);
        // 设置是否查询数量信息（用于分页统计等场景）
        videoInfoQuery.setQueryCountInfo(true);

        // 调用视频信息帖子服务的分页查询方法，传入查询条件，获取分页结果
        PaginationResultVO resultVO = videoInfoPostService.findListByPage(videoInfoQuery);
        // 将查询结果封装为成功响应返回给前端
        return getSuccessResponseVO(resultVO);
    }

    /**
     * 获取视频数量信息接口
     *
     * @return ResponseVO 统一响应结果
     */
    @RequestMapping("/getVideoCountInfo")
    public ResponseVO getVideoCountInfo() {
        // 从 Token 中获取用户信息 DTO，用于获取用户标识等数据
        TokenUserInfoDto tokenUserInfoDto = getTokenUserInfoDto();

        // 初始化视频信息查询对象，封装查询条件
        VideoInfoPostQuery videoInfoPostQuery = new VideoInfoPostQuery();
        // 设置查询的用户 ID，从 Token 解析出的用户信息中获取
        videoInfoPostQuery.setUserId(tokenUserInfoDto.getUserId());

        // 1. 查询“审核通过”状态的视频数量
        // 设置查询状态为枚举定义的 STATUS3（审核通过状态）
        videoInfoPostQuery.setStatus(VideoStatusEnum.STATUS3.getStatus());
        // 调用服务方法，根据参数（用户 ID + 状态）统计数量
        Integer auditPassCount = videoInfoPostService.findCountByParam(videoInfoPostQuery);

        // 2. 查询“审核失败”状态的视频数量
        // 更新查询状态为枚举定义的 STATUS4（审核失败状态）
        videoInfoPostQuery.setStatus(VideoStatusEnum.STATUS4.getStatus());
        // 再次调用统计方法，获取审核失败的视频数量
        Integer auditFailCount = videoInfoPostService.findCountByParam(videoInfoPostQuery);

        // 3. 查询“进行中”状态的视频数量（通过排除审核通过、失败状态实现）
        // 清空状态参数，准备设置排除状态
        videoInfoPostQuery.setStatus(null);
        // 设置需要排除的状态数组（STATUS3、STATUS4），即统计除这两种状态外的数量
        videoInfoPostQuery.setExcludeStatusArray(new Integer[]{
                VideoStatusEnum.STATUS3.getStatus(),
                VideoStatusEnum.STATUS4.getStatus()
        });
        // 调用统计方法，获取“进行中”（或其他未明确状态）的视频数量
        Integer inProgress = videoInfoPostService.findCountByParam(videoInfoPostQuery);

        // 封装统计结果到 VO 对象
        VideoStatusCountInfoVO countInfoVO = new VideoStatusCountInfoVO();
        countInfoVO.setAuditFailCount(auditFailCount);
        countInfoVO.setAuditPassCount(auditPassCount);
        countInfoVO.setInProgress(inProgress);

        // 将统计结果封装为成功响应，返回给前端
        return getSuccessResponseVO(countInfoVO);
    }

}
